奇虎 360 温铭:Nginx + Lua 高性能 Web 平台OpenResty 的未来
2016年9月10日,第52期【OSC源创会】在珠海圆满落幕,350余名OSCer齐聚报业大厦,聆听了一场诚意满满、干货多多的技术分享盛会。
本期源创会由5位讲师分别针对5个不同的主题进行分享,为给未能到现场以及参与活动后仍意犹未尽的OSCer更好的了解和学习,开源中国将每位讲师的演讲内容进行了整理,并将逐一发布。干货多多,不容错过!
OpenResty 是把 Nginx 和 Lua 有机融合在一起的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项,用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。本期,奇虎360技术开源委员会委员、OpenResty 软件基金会主席温铭,对 OpenResty的技术链、近一年以来的新增特性、社区的发展以及未来的规划进了分享。完整演讲内容如下:
大家好,首先简单做个自我介绍,我是温铭,在珠海呆了快十年,前面四五年在金山做个人软件,后面四五年在360做企业软件。
首先说一下,由于只有半小时左右的演讲时间,所以不会涉及到很深入的东西。我希望大家通过我这次演讲,之前没有接触过 OpenResty 的,听完后会觉得还有点意思,有兴趣去搜索了解一下,去自己电脑上跑个“Hello World”, 在后面做技术选型的时候有新的一个选择,那我就觉得这个演讲的目的已经达到了。
OpenResty 最近曝光最多的是在去年锤子的发布会上获得了锤子一百万的捐赠,其他时间的曝光率并不是特别高。接下来我会大概跟大家说一下 OpenResty 还有 OpenResty 社区的特性和发展。
其实不仅是 OpenResty 社区,对任何一个开源社区来说,未来的发展在我看来都取决于两个方面,一个是它的技术,是不是能解决一些真实的环境、公司业务里面遇到的问题,还有一个就是它的社区和社区的发展,你的社区做的怎么样,很大的情况下会决定你的开源软件未来会是怎样的发展。
下图是去年10月份 OpenResty 在北京举行的第一次大会,这些都是当时的一些讲师,最中间的是 OpenResty 的作者章亦春,其他的大部分来自于 CDN 行业和云厂商。但其实 OpenResty 的用户不止于 CDN 公司和云厂商,只不过在这些公司和厂商的服务端上,OpenResty 应用非常广泛,在 CDN 行业 OpenResty 已经是事实上的一个标准。京东是我们在国内最大的一个 OpenResty 用户,你在京东上看到的所有商品详情页的调用都是基于 OpenResty 做的。还有新浪财经、新浪股票和新浪体育所有的后端,包括360搜索页面的跳转,同样都是基于 OpenResty。在国外大家比较常用的 Github、CloudFlare 也都有用 OpenResty 做一些服务。
简单来说,它不像 Golang 一样,是凭空从零搭建的,而是把 Nginx 和 Lua 有机融合在一起,站在两位巨人肩膀上诞生的。特别有意思的是,我们平常用到的绝大部分的互联网技术都是基于欧美的,但是这三个技术,Nginx 是俄罗斯的,Lua 的作者是巴西的,OpenResty 的作者是中国的。
说白了就是可以用脚本语言,用 Lua 来控制 Nginx 的行为。就比如说刚才魅族的于讲师有讲到他们用C++去做控制,要自己实现协程,但是在 OpenResty 里面,它像 Golang 一样天生就有协程。还有一个好处是,OpenResty 所有的参数和行为都可以在程序里面动态的去做,完全不用重启和reload,因为它是基于 Nginx 之上的,性能非常高。所以如果你有一个高性能的场景,除了 Golang 之外,OpenResty 也是很好的选择。
在说到 OpenResty 时,更多人可能听说过的是 ngx_lua。这其实也是有历史原因的,因为有很多项目是在原生的 Nginx 版本里面嵌入了 ngx_lua 这个模块,来做到刚才说的动态控制。但事实上,ngx_lua 只是 OpenResty 里面的一小部分。OpenResty 这个开源项目下面有50多个小项目,都是和OpenResty、Nginx、Lua相关的。
我大概列了其中的十几个项目。首先,我们知道测试在开源项目里面是特别重要的,但我们其实是很难做到类似于测试驱动开发、测试代码覆盖率、自动化测试、CI等等,这种东西听起来很美好,但做起来难度很高。OpenResty 是我见过在开源项目里面测试这一块做的最好的,后面会单独来讲一下这块。此外,OpenResty 做的比较好的还有动态跟踪,我们可以不做侵入性的修改,就能发现问题所在。还有像是客户端文档、二进制包、docker 包等等。
前段时间我在公司内部给新员工做培训时有说这样一句话,测试是区别程序员和程序猿的一个标准。你是机械的在工作,还是会经常思考怎么样提高生产力的在工作,区别就是在测试这一块。
测试其实是很多程序员不愿意做的事,但测试又确实特别重要,用章亦春春哥的话说就是,你如果没有做测试,那你晚上会睡不着觉,因为不知道发版本的时候程序能不能跑起来;但是如果你做了测试,那你发版本的时候就可以很安心的睡觉,因为程序肯定可以跑得起来。当然,前提是测试的设计要好,要有科学的方法,这其实也是一门艺术。这个网址 会显示OpenResty下面各个项目的测试运行情况,有需要的可以去看看。
测试这一块还值得一提的是 Test::Nginx,它会给每一个测试案例起一个 Nginx 实例,在里面把一些测试按钮跑完后,Nginx 的环境就会自动清掉;当下一次进行测试时,再重新起一个Nginx 实例。它是用自己定义的一套语法来描述测试案例要怎么跑、预期的结果会是怎样、你需要预备一些什么数据等等。另外就是mock,在Nginx、OpenResty 测试中也是较常使用的,比如说你访问的 redis 返回一个错误码,而你在正常的测试环境是很难遇到的。再比如 mockeagain,这个开源项目其实是比较适用很特殊的情况,比如模拟网络非常缓慢的时候。
说完测试来聊聊动态追踪,这个是 OpenResty 里面非常有特色的一个点。动态追踪是指我们在线上跑一个服务,当出现问题时,动态追踪可以不改一行代码、甚至在不知道别人代码如何实现的情况下,找到问题所在。它可以帮助软件工程师以非常低的成本,在非常短的时间内,跟踪程序的运行情况,并给出直观的图表,从而更快速地排查和解决问题。下图是一个动态追踪的火焰图,图中的颜色深浅其实是没有意义的,它就是对程序占用 CPU 做了一次采样,再进行绘制。正常情况是左边的驼峰形状,当出现图中右边的情况则说明了这是问题所在,可以直接看到是哪个函数占了 CPU 资源。
现在的调试工具是很乱、很不统一的,像是有 DTrace、SystemTap、ePBF/BCC、GDB、LLDB 这些。我们希望做到的是能有一种语言将所有调试相关的东西,包括静态和动态,都能解决掉。这个语言我们称为Y语言,其实就是英文的“WHY”谐音。前面说到的所有调试相关的东西,春哥写了一篇文章, ,有兴趣的可以去看看。
那说完调试,来说说标准库。下图所列的都是 OpenResty 中自带的标准库,包括字符串的处理、上游的处理,还有一些缓存和其它常见的处理。
再有是 web 框架,在OpenResty里面,你要写一个框架非常简单,有大概20个开源项目都是做这种 web 框架的。
至于数据库和存储相关的第三方就更多了,都可以直接用 OpenResty 调用,不用自己写。
汇总链接如下:
OpenResty 和其他语言相比有很不一样的特点,就是可以深入到业务当中去。举几个栗子:
openresty.org 这个网站的 DNS 原本用的是dnspod,但 dnspod 在国外的服务不稳定,导致社区的用户对其不太满意,因此 OpenResty 自己写了一套 DNS。
还有 WAF,其实目前好的 WAF 都没有开源,现在开源的 WAF 并没有一个特别好的环境去做到特别牛。OpenResty 社区也会去开发、开源一套比所有商业项目更好的一套 WAF。还有正则引擎,我们知道 WAF 的规则都是基于正则来做的,比如说,一个 WAF 有一万条规则,当一个请求进来,难道要匹配一万次?这明显是不能容忍的,但事实上很多开发者都是这么做的,我们希望做的是能够合并掉规则,到 WAF 运行的时候可能只有几条规则进行匹配。所以我们需要一个更好的正则引擎,这个引擎目前也在 OpenResty 的开源项目里。这个正则引擎的效率比目前已知的引擎效率要高,但是还需要测试。
再有就是 DSL,就像之前说的 Y 语言,OpenResty 社区受创始人的影响,比较偏爱小语言。比如说当要用 Lua 写 OpenResty 代码,但很多人又不愿意学 Lua,那么就可以其他语言来做,再用 DSL 引擎将其底层变成 Lua 代码,实现代码的高度优化。
这个是我们年初的时候发的roadmap,其中的第一个和第二个其实就是为了实现推送功能,都已经打包在最新的 OpenResty 稳定版中。第三个和第四个就是刚才说的 WAF,最后一个就是 DSL。
前面讲了这么多,其实我们可以看到,贯穿 OpenResty 核心开发的就是合适你业务的小语言。你觉得哪个语言好,都可以将其特色挪过来,兼容并包。所以在 OpenResty 社区里面从来没有语言方面的冲突。
说到社区,在我看来,OpenResty 的社区是这样的:
首先,社区受创始人章亦春的影响非常大。之前有开玩笑说过,一个社区发展有没有前途,是看社区的创始人能活多少岁。对于社区来讲,创始人可以非常民主,也可以非常专治,而春哥则是“仁慈的君主”。当有小白用户在社区提问,他会很详细的列出1、2、3、4……进行解答,每天都在回复,一直坚持了五六年。
社区目前主要是在邮件列表和微信群进行沟通,一般解答流程是先由委员会成员来回复,如果提问后2-3天没有收到委员会的回复或者回复错误,春哥会亲自回复,以保证所有的问题都能得到及时解答。另外也有 QQ 群,基本上国内所有的 OpenResty 开发者都在里面。
当然,我们也有更长远的发展规划,我们一直在做 NPO,希望能永远的运营下去,脱离于单个人的影响。现在的 NPO 是以 OpenResty 软件基金会为主体,我们需要这个一个合法的机制来保证社区的长久运营。
春哥正在写一本叫做 programming OpenResty 的书,到现在已经写了几个月,在写测试这块。另外,基金会也会赞助 OpenResty 本身以及更多相关技术的发展。
谢谢!
PPT下载地址:
欢迎任何形式的转载,但请务必注明出处,尊重他人劳动成果。转载时请注明:文章转载自开源中国公众号 (ID:oschina2013)
了解更多详情请点击“阅读原文”
开源中国|ID:oschina2013
每天为你送上精选资讯早点
还有每天的 OSChina 乱弹哦